from hide_info import hide_in_img
import tkinter as tk
from tkinter import filedialog, messagebox

def select_file(title, filetypes):
    return filedialog.askopenfilename(title=title, filetypes=filetypes)

def save_file(title, defaultextension, filetypes):
    return filedialog.asksaveasfilename(title=title, defaultextension=defaultextension, filetypes=filetypes)

class HideFileApp:
    def __init__(self, root):
        self.root = root
        self.root.title("藏物于图工具")
        self.root.geometry("600x400")
        
        # 创建两个功能框架
        encode_frame = tk.LabelFrame(root, text="文件隐藏到图片", padx=10, pady=10)
        encode_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=5, pady=5)
        
        decode_frame = tk.LabelFrame(root, text="从图片提取文件", padx=10, pady=10)
        decode_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=5, pady=5)
        
        # 文件隐藏到图片区域
        tk.Label(encode_frame, text="选择要隐藏的文件:").pack()
        self.encode_input_entry = tk.Entry(encode_frame, width=40)
        self.encode_input_entry.pack()
        tk.Button(encode_frame, text="浏览", 
                 command=lambda: self.encode_input_entry.insert(0, select_file("选择要隐藏的文件", [("所有文件", "*.*")]))).pack()
        
        tk.Label(encode_frame, text="选择载体图片:").pack()
        self.encode_img_entry = tk.Entry(encode_frame, width=40)
        self.encode_img_entry.pack()
        tk.Button(encode_frame, text="浏览", 
                 command=lambda: self.encode_img_entry.insert(0, select_file("选择载体图片", [("图片文件", "*.png;*.jpg;*.jpeg")]))).pack()
        
        tk.Label(encode_frame, text="保存结果图片:").pack()
        self.encode_output_entry = tk.Entry(encode_frame, width=40)
        self.encode_output_entry.pack()
        tk.Button(encode_frame, text="浏览", 
                 command=lambda: self.encode_output_entry.insert(0, save_file("保存结果图片", ".png", [("PNG图片", "*.png")]))).pack(pady=5)
        
        tk.Button(encode_frame, text="开始隐藏", command=self.encode_file, bg="#4CAF50", fg="white").pack(pady=10)
        
        # 从图片提取文件区域
        tk.Label(decode_frame, text="选择藏有文件的图片:").pack()
        self.decode_img_entry = tk.Entry(decode_frame, width=40)
        self.decode_img_entry.pack()
        tk.Button(decode_frame, text="浏览", 
                 command=lambda: self.decode_img_entry.insert(0, select_file("选择藏有文件的图片", [("图片文件", "*.png;*.jpg;*.jpeg")]))).pack()
        
        tk.Label(decode_frame, text="保存提取的文件:").pack()
        self.decode_output_entry = tk.Entry(decode_frame, width=40)
        self.decode_output_entry.pack()
        tk.Button(decode_frame, text="浏览", 
                 command=lambda: self.decode_output_entry.insert(0, save_file("保存提取的文件", "", [("所有文件", "*.*")]))).pack(pady=5)
        
        tk.Button(decode_frame, text="开始提取", command=self.decode_file, bg="#2196F3", fg="white").pack(pady=10)
        
        # 状态标签
        self.status_label = tk.Label(root, text="", fg="red")
        self.status_label.pack(side=tk.BOTTOM, fill=tk.X, pady=10)
    
    def encode_file(self):
        try:
            input_file = self.encode_input_entry.get()
            img_file = self.encode_img_entry.get()
            output_img = self.encode_output_entry.get()
            
            if not all([input_file, img_file, output_img]):
                self.status_label.config(text="错误: 请填写所有字段", fg="red")
                return
            
            hide_in_img.file_encode(filename=input_file, img_filename=img_file, img_filename_new=output_img)
            self.status_label.config(text=f"成功: 文件已隐藏到图片!\n保存路径: {output_img}", fg="green")
        except Exception as e:
            self.status_label.config(text=f"错误: {str(e)}", fg="red")
    
    def decode_file(self):
        try:
            img_file = self.decode_img_entry.get()
            output_file = self.decode_output_entry.get()
            
            if not all([img_file, output_file]):
                self.status_label.config(text="错误: 请填写所有字段", fg="red")
                return
            
            hide_in_img.file_decode(filename=output_file, img_filename=img_file)
            self.status_label.config(text=f"成功: 文件已提取!\n保存路径: {output_file}", fg="green")
        except Exception as e:
            self.status_label.config(text=f"错误: {str(e)}", fg="red")

if __name__ == "__main__":
    root = tk.Tk()
    app = HideFileApp(root)
    root.mainloop()